<!DOCTYPE html>
<html lang="en">
<head>
	<meta charset="UTF-8">
	<title>Document</title>
</head>
<body>
<script>
	// 浅拷贝函数
	function extendCopy(p) {
		var c = {};
		for(var i in p){
			c[i] = p[i]
		}
		c.uber = p;
		return c;
	}

	// 深拷贝函数
	function deepCopy(p, c){
		c = c || {};
		for(var i in p){
			if(p.hasOwnProperty(i)) {
				if(typeof p[i] === 'object') {
					c[i] = Array.isArray(p[i]) ? [] : {};
					deepCopy(p[i], c[i]);
				}else{
					c[i] = p[i];
				}
			}
		}
		return c;
	}

	// 现在我们来创建一个对象，该对象包含数组和子对象
	var parent = {
		numbers: [1, 2, 3],
		letters: ['a', 'b', 'c'],
		obj: {
			prop: 1
		},
		bool: true
	};

	// 下面，我们分别用深拷贝和浅拷贝来测试一下，就会发现两者的不同。在深拷贝中，对拷贝对象的numbers属性进行更新不会对原对象产生影响。
	var mydeep = deepCopy(parent);
	var myshallow = extendCopy(parent);
	console.log(mydeep.numbers.push(4,5,6));

	console.log(parent.numbers);
	console.log(myshallow.numbers.push(10));
	console.log(myshallow.numbers);
	console.log(parent.numbers);
	console.log(mydeep.numbers);

	// 使用deepCopy要注意两点
	// -	在拷贝每个属性之前，建议使用hasOwnProperty()来确认不会误拷贝不需要的继承属性
	// -	由于区分Array对象和普通Object对象相当繁琐，所以es5标准中实现了Array.isArray()函数。这个跨浏览器的最佳解决方案（换句话说，为仅支持ES3的环境提供isArray()函数）虽然看起来有点取巧，但是确是有效果的
	if(Array.isArray !== 'function') {
		Array.isArray = function (candidate) {
			return Object.prototype.toString.call(candidate) === '[Object Array]';
		};
	}
</script>
</body>
</html>